#!/bin/bash

# 测试使用日志文件的IO监控功能

# 创建临时的日志文件路径
IO_DATA_FILE="/tmp/cpu_scheduler_io_data.log"

# 重写日志函数以避免干扰测试
log_message() {
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] [$1] $2"
}

# 获取详细的IO负载信息（简化版）
get_io_load() {
    # 检查/proc/diskstats文件是否存在
    if [ ! -r "/proc/diskstats" ]; then
        log_message "ERROR" "无法读取/proc/diskstats文件"
        echo ""
        return
    fi
    
    # 读取上一次的IO统计数据（如果存在）
    if [ -f "$IO_DATA_FILE" ]; then
        local last_data=$(cat "$IO_DATA_FILE")
        if [ -n "$last_data" ]; then
            IFS=',' read -r LAST_READ_SECTORS LAST_WRITE_SECTORS LAST_IO_TIME <<< "$last_data"
        fi
    else
        LAST_READ_SECTORS=0
        LAST_WRITE_SECTORS=0
        LAST_IO_TIME=0
    fi
    
    # 获取当前时间戳（毫秒）
    local current_time=$(date +%s%3N)
    
    # 读取/proc/diskstats并计算总读写扇区数
    local current_read_sectors=0
    local current_write_sectors=0
    
    # 解析/proc/diskstats中的数据
    # 字段格式: 主设备号 次设备号 设备名 读请求数 读合并数 读扇区数 读等待时间 写请求数 写合并数 写扇区数 写等待时间 IO等待时间 IO等待队列 IO处理时间
    while IFS= read -r line; do
        # 将行分割为字段数组
        local fields=($line)
        
        # 确保有足够的字段
        if [ ${#fields[@]} -ge 14 ]; then
            local device_name="${fields[2]}"
            
            # 只处理物理磁盘设备，忽略loop等虚拟设备
            case "$device_name" in
                loop*|ram*)
                    # 这是虚拟设备，跳过
                    ;;
                *)
                    # 这是物理设备，处理它
                    local read_sectors="${fields[5]}"   # 读扇区数是第6列（索引5）
                    local write_sectors="${fields[9]}"  # 写扇区数是第10列（索引9）
                    
                    # 累加到总计数中
                    current_read_sectors=$((current_read_sectors + read_sectors))
                    current_write_sectors=$((current_write_sectors + write_sectors))
                    ;;
            esac
        fi
    done < /proc/diskstats
    
    # 计算实时IO速度
    local read_speed_kbs=0
    local write_speed_kbs=0
    
    # 如果不是第一次调用，计算速度
    if [ $LAST_IO_TIME -ne 0 ]; then
        local time_diff=$((current_time - LAST_IO_TIME))
        
        # 确保时间差不为0，避免除以0的错误
        if [ $time_diff -gt 0 ]; then
            # 计算扇区数的变化量（每扇区512字节）
            local read_sectors_diff=$((current_read_sectors - LAST_READ_SECTORS))
            local write_sectors_diff=$((current_write_sectors - LAST_WRITE_SECTORS))
            
            # 转换为字节并计算每秒速度 (扇区差 * 512字节 * 1000毫秒) / 时间差 = 字节/秒
            local read_bytes_per_sec=$((read_sectors_diff * 512 * 1000 / time_diff))
            local write_bytes_per_sec=$((write_sectors_diff * 512 * 1000 / time_diff))
            
            # 转换为KB/s
            read_speed_kbs=$((read_bytes_per_sec / 1024))
            write_speed_kbs=$((write_bytes_per_sec / 1024))
        fi
    fi
    
    # 保存当前IO统计数据到文件，供下次使用
    echo "$current_read_sectors,$current_write_sectors,$current_time" > "$IO_DATA_FILE"
    
    # 构建结果字符串
    local result="read_speed_kbs=$read_speed_kbs,write_speed_kbs=$write_speed_kbs"
    echo "$result"
}

# 测试IO监控功能
echo "第一次调用IO监控:"
io_data1=$(get_io_load)
echo "结果: $io_data1"

echo "等待2秒..."
sleep 2

echo "第二次调用IO监控:"
io_data2=$(get_io_load)
echo "结果: $io_data2"

echo "等待2秒..."
sleep 2

echo "第三次调用IO监控:"
io_data3=$(get_io_load)
echo "结果: $io_data3"

echo ""
echo "查看日志文件内容:"
if [ -f "$IO_DATA_FILE" ]; then
    echo "日志文件内容: $(cat $IO_DATA_FILE)"
else
    echo "日志文件不存在"
fi